/* 
*@module: uploadExcel
*@author: 刘千红
*/


const ExcelDataUpload = require('../../models/table/uploadExcel.js')
const AllMap = require('../../models/common/Map.js')

var reference_17_ground_Map, element_Map, unit_Map, reference_17_water_Map

AllMap.then(data => {
  reference_17_ground_Map = data.reference_17_ground_Map
  element_Map = data.element_Map
  unit_Map = data.unit_Map_ground
  reference_17_water_Map = data.reference_17_water_Map
})//将各种映射传入，按照需求进行操作

class excel_Controller {

  /**
   * 从前端将表格的数据传入后端，进行数据库数据的更新
   * @param ctx data excel数据
   * @param ctx database_type 需要上传的数据表
   * 
   * @memberof excel_Controller
   */


  static async uploadExcel(ctx) {
    let { data, database_type } = ctx.request.body //从前端传入数据

    var count = 0
    var datefalse = 0
    var updateDate



    let insertAndUpdate = []
    let whetherSuccess = []

    let no_point_num_date = []
    let no_Project_num_date = []
    let Project_num_date = []


    let no_Project_num_number = 0
    let no_point_num_number = 0

    data.map(item => {
      delete item.id
    })//删除id的字段
    console.log(77777, data);

    for (let i of data) {
      console.log(88888, i.project_num);
      let have_Project_num = await ExcelDataUpload.findProject_num(i.project_num) //将含有project——num的数据剔除出来
      let have_Point_num = await ExcelDataUpload.findPoint_num(i.project_num, i.point_num)//将含有point_num的数据剔除出来



      have_Project_num = have_Project_num.map(item => {
        return item = item.dataValues
      })


      have_Point_num = have_Point_num.map(item => {
        return item = item.dataValues
      })

      if (have_Project_num.length !== 0) { // 表示数据库中含有相应的地块信息（project_num）
        if (have_Point_num.length == 0) { // 表示数据库中不含有相应的检测点位信息（point_num）

          no_point_num_number = no_point_num_number + 1 //统计不含有的数量
          Project_num_date.push(i.project_num)// 将地块信息存储，以备后面调用
          no_point_num_date.push(i.point_num) // 将不包含的监测点位信息存储，以备后面调用

        }
      } else {
        no_Project_num_number = no_Project_num_number + 1//统计不含有地块信息的数量
        no_Project_num_date.push(i.project_num)//将不包含的地块信息存储，以备后面调用
      }
    }

    if (no_Project_num_number !== 0 && no_point_num_number == 0) {
      ctx.body = {
        msg: '表中不含有' + no_Project_num_date + '地块信息，' + '请先导入相应的地块信息表'
      }
    } else if (no_Project_num_number == 0 && no_point_num_number != 0) {
      ctx.body = {
        msg: '在地块信息' + Project_num_date + '中不含有' + no_point_num_date + '监测点位，' + '请先导入监测点位信息表'
      }
    } else if (no_Project_num_number !== 0 && no_point_num_number != 0) {
      ctx.body = {
        msg: '表中地块信息' + Project_num_date + '中不含有' + no_point_num_date + '监测点位' + '且整体不包含' + no_Project_num_date + '地块信息' + '请先导入监测点位信息表和地块信息表'
      }
    } else if (no_Project_num_number == 0 && no_point_num_number == 0) {

      updateDate = await ExcelDataUpload.upload(data, database_type)//将数据传入model更新数据库

      insertAndUpdate = updateDate[1]//将model传来的更新以及插入的对象
      whetherSuccess = updateDate[0]//将计数穿入进行操作


      if (database_type == 5) {//操作土壤检测背景数据

        data.map(item => {
          var a = new Date(item.date);
          var y = a.getFullYear();
          var m = a.getMonth() + 1; //月份从0开始，所以要+1
          var d = a.getDate();
          var myday1 = y + "." + m + "." + d;
          //重新组装和原来的字符串进行比较，判断是否相同
          var date_now = new Date();
          //得到当前年份
          var year = date_now.getFullYear();
          //得到当前月份
          //注：
          //  1：js中获取Date中的month时，会比当前月份少一个月，所以这里需要先加一
          //  2: 判断当前月份是否小于10，如果小于，那么就在月份的前面加一个 '0' ， 如果大于，就显示当前月份
          var month = date_now.getMonth() + 1 < 10 ? "0" + (date_now.getMonth() + 1) : (date_now.getMonth() + 1);
          //得到当前日子（多少号）
          var date = date_now.getDate() < 10 ? "0" + date_now.getDate() : date_now.getDate();
          var myday2 = year + "." + month + "." + date;

          if (myday1 != item.date || myday2 < item.date) {

            datefalse++
          }
        })//计算日期不正确的数据条数


        insertAndUpdate.forEach((item) => {
          for (let key in item) {
            if (item[key] && reference_17_ground_Map.has(key)) {
              if (item[key] > reference_17_ground_Map.get(key)) {
                count += 1
              }
            }
          }
          item['count'] = count
          let res1 = ExcelDataUpload.updateCount(item, item.sample_num, item.point_num, item.assess_type, item.project_num)

          count = 0
        })//计算污染元素数量

      } else if (database_type == 3) {//操作水检测背景数据

        data.map(item => {
          var a = new Date(item.date);
          var y = a.getFullYear();
          var m = a.getMonth() + 1; //月份从0开始，所以要+1
          var d = a.getDate();
          var myday1 = y + "." + m + "." + d;
          //重新组装和原来的字符串进行比较，判断是否相同


          var date_now = new Date();
          //得到当前年份
          var year = date_now.getFullYear();
          //得到当前月份
          //注：
          //  1：js中获取Date中的month时，会比当前月份少一个月，所以这里需要先加一
          //  2: 判断当前月份是否小于10，如果小于，那么就在月份的前面加一个 '0' ， 如果大于，就显示当前月份
          var month = date_now.getMonth() + 1 < 10 ? "0" + (date_now.getMonth() + 1) : (date_now.getMonth() + 1);
          //得到当前日子（多少号）
          var date = date_now.getDate() < 10 ? "0" + date_now.getDate() : date_now.getDate();
          var myday2 = year + "." + month + "." + date;

          if (myday1 != item.date || myday2 < item.date) {

            datefalse++
          }

        })//计算日期不正确的数据条数


        insertAndUpdate.forEach((item) => {
          for (let key in item) {
            if (item[key] && reference_17_water_Map.has(key)) {
              if (item[key] > reference_17_water_Map.get(key)) {
                count += 1
              }
            }
          }
          item['count'] = count
          let res1 = ExcelDataUpload.updateWaterCount(item, item.sample_num, item.point_num, item.assess_type, item.project_num)

          count = 0
        })//计算污染元素数量
      } else if (database_type == 4) {//操作水实时监测数据

        data.map(item => {
          var a = new Date(item.date);
          var y = a.getFullYear();
          var m = a.getMonth() + 1; //月份从0开始，所以要+1
          var d = a.getDate();
          var myday1 = y + "." + m + "." + d;
          //重新组装和原来的字符串进行比较，判断是否相同
          var date_now = new Date();
          //得到当前年份
          var year = date_now.getFullYear();
          //得到当前月份
          //注：
          //  1：js中获取Date中的month时，会比当前月份少一个月，所以这里需要先加一
          //  2: 判断当前月份是否小于10，如果小于，那么就在月份的前面加一个 '0' ， 如果大于，就显示当前月份
          var month = date_now.getMonth() + 1 < 10 ? "0" + (date_now.getMonth() + 1) : (date_now.getMonth() + 1);
          //得到当前日子（多少号）
          var date = date_now.getDate() < 10 ? "0" + date_now.getDate() : date_now.getDate();
          var myday2 = year + "." + month + "." + date;

          if (myday1 != item.date || myday2 < item.date) {

            datefalse++
          }
        })//计算日期不正确的数据条数


        insertAndUpdate.forEach((item) => {
          for (let key in item) {
            if (item[key] && reference_17_water_Map.has(key)) {
              if (item[key] > reference_17_water_Map.get(key)) {
                count += 1
              }
            }
          }
          item['count'] = count
          let res1 = ExcelDataUpload.updateDetectorWaterCount(item, item.sample_num, item.point_num, item.assess_type, item.project_num)

          count = 0
        })//计算污染元素数量
      } else if (database_type == 6) {//操作土壤实时监测数据

        data.map(item => {
          var a = new Date(item.date);
          var y = a.getFullYear();
          var m = a.getMonth() + 1; //月份从0开始，所以要+1
          var d = a.getDate();
          var myday1 = y + "." + m + "." + d;
          //重新组装和原来的字符串进行比较，判断是否相同


          var date_now = new Date();
          //得到当前年份
          var year = date_now.getFullYear();
          //得到当前月份
          //注：
          //  1：js中获取Date中的month时，会比当前月份少一个月，所以这里需要先加一
          //  2: 判断当前月份是否小于10，如果小于，那么就在月份的前面加一个 '0' ， 如果大于，就显示当前月份
          var month = date_now.getMonth() + 1 < 10 ? "0" + (date_now.getMonth() + 1) : (date_now.getMonth() + 1);
          //得到当前日子（多少号）
          var date = date_now.getDate() < 10 ? "0" + date_now.getDate() : date_now.getDate();
          var myday2 = year + "." + month + "." + date;

          if (myday1 != item.date || myday2 < item.date) {

            datefalse++
          }

        })//计算日期不正确的数据条数

        insertAndUpdate.forEach((item) => {
          for (let key in item) {
            if (item[key] && reference_17_ground_Map.has(key)) {
              if (item[key] > reference_17_ground_Map.get(key)) {
                count += 1
              }
            }
          }
          item['count'] = count
          let res1 = ExcelDataUpload.updateDetectorGroundCount(item, item.sample_num, item.point_num, item.assess_type, item.project_num)

          count = 0
        })
      }//计算污染元素数量
      if (whetherSuccess != 0 && datefalse != 0) {
        ctx.body = {
          msg: '更新' + updateDate[0] + '条数据成功,' + datefalse + '条数据日期不符合要求'
        }
      } else if (whetherSuccess != 0 && datefalse == 0) {
        ctx.body = {
          msg: '更新' + updateDate[0] + '条数据成功'
        }
      } else if (whetherSuccess == 0 && datefalse == 0) {
        ctx.body = {
          msg: '更新' + updateDate[0] + '条数据成功'
        }
      } else if (whetherSuccess == 0 && datefalse != 0) {
        ctx.body = {
          msg: '更新' + updateDate[0] + '条数据成功' + datefalse + '条数据日期不符合要求'
        }
      } else {
        ctx.body = {
          msg: '导入失败'
        }
      }

    } else {
      ctx.body = {
        msg: '导入失败'
      }
    }


  }

  /**
   *前端传入数据，更新数据库中的地块信息以及监测点位信息表
   *
   * @static
   * @param {*} ctx
   * @memberof excel_Controller
   */
  static async uploadProjectAndPointExcel(ctx) {
    let { data, database_type } = ctx.request.body //从前端传入数据
    console.log(8888888888, data);

    var updateDate


    let insertAndUpdate = []
    let whetherSuccess = []

    let no_Project_num_date = []
    let no_Project_num_number = 0

    data.map(item => {
      delete item.id
    })//删除id的字段
    console.log(77777, data);

    if (database_type == 1) {//更新地块信息表
      updateDate = await ExcelDataUpload.upload(data, database_type)//将数据传入model更新数据库

      insertAndUpdate = updateDate[1]//将model传来的更新以及插入的对象
      whetherSuccess = updateDate[0]//将计数穿入进行操作


      ctx.body = {
        msg: '导入' + whetherSuccess + '条数据成功'
      }

    } else if (database_type == 2) {//更新监测点位表


      for (let i of data) {

        let have_Project_num = await ExcelDataUpload.findProject_num(i.project_num) //将含有project——num的数据剔除出来

        have_Project_num = have_Project_num.map(item => {
          return item = item.dataValues
        })
        console.log(78, have_Project_num);

        if (have_Project_num.length == 0) {//说明数据库中不含有这个地块信息
          no_Project_num_number = no_Project_num_number + 1//统计不含有地块信息的数量
          no_Project_num_date.push(i.project_num)//将不包含的地块信息存储，以备后面调用
          console.log(56, no_Project_num_number);
        }
      }

      if (no_Project_num_number !== 0) {
        ctx.body = {
          msg: '表中不含有' + no_Project_num_date + '地块信息，' + '请先导入相应的地块信息表'
        }
      } else {

        updateDate = await ExcelDataUpload.upload(data, database_type)//将数据传入model更新数据库
        whetherSuccess = updateDate[0]//将计数穿入进行操作

        ctx.body = {
          msg: '导入' + whetherSuccess + '条数据成功'
        }
      }


    }



  }



  /**
   *前端传入数据，更新数据库中的R2相关系数表以及第三阶段的标准表
   *
   * @static
   * @param {*} ctx
   * @memberof excel_Controller
   */
  static async uploadR2Excel(ctx) { //更新R2表
    let { data, database_type } = ctx.request.body //从前端传入数据，不用传入数据类型
    data.map(item => {
      delete item.id
    })//删除id的字段

    if (database_type == 8) {//更新土壤R2数据误差表
      let no_detector_project_num = []
      let no_lab_project_num = []
      let no_detector_num = 0
      let no_lab_num = 0
      let have_detector = []
      let have_lab = []
      let count

      for (let i of data) {
        delete i.id
        have_detector = await ExcelDataUpload.findDetectorGroundProject_num(i.project_num)
        have_lab = await ExcelDataUpload.findLabGroundProject_num(i.project_num)

        have_detector = have_detector.map(item => {
          return item = item.dataValues
        })//数据转换格式只取出有意义的数据

        have_lab = have_lab.map(item => {
          return item = item.dataValues
        })//数据转换格式只取出有意义的数据

        if (have_detector.length == 0) {
          no_detector_project_num.push(i.project_num)
          no_detector_num = no_detector_num + 1

        }//若数据库中土壤实时监测数据表中没有该地块信息则计数并将相应的地块信息存储起来

        if (have_lab.length == 0) {
          no_lab_project_num.push(i.project_num)
          no_lab_num = no_lab_num + 1
        }//若数据库中土壤实验室背景数据表中没有该地块信息则计数并将相应的地块信息存储起来


      }

      if (no_detector_num != 0 && no_lab_num != 0) {
        ctx.body = {
          msg: '土壤实时监测数据表中不含有' + no_detector_project_num + '地块信息且土壤背景数据表中不含有' + no_lab_project_num + '地块信息，请先导入土壤实时监测数据表和土壤背景数据表。'
        }
      } else if (no_detector_num != 0 && no_lab_num == 0) {
        ctx.body = {
          msg: '土壤实时监测数据表中不含有' + no_detector_project_num + '地块信息，请先导入土壤实时监测数据表。'
        }
      } else if (no_detector_num == 0 && no_lab_num != 0) {
        ctx.body = {
          msg: '土壤背景数据表中不含有' + no_lab_project_num + '地块信息，请先导入土壤背景数据表。'
        }
      } else if (no_detector_num == 0 && no_lab_num == 0) {

        let updateRtable = await ExcelDataUpload.updateRtable(data)
        count = updateRtable
        ctx.body = {
          msg: '更新r2土壤相关数据表' + count + '条数据成功'
        }
      }
    } else if (database_type == 9) {//更新修复阶段标准表

      let have_ground_assess_type = []
      let have_ground = []
      let have_assess_type_3 = []


      for (let i of data) {
        delete i.id
        have_ground = await ExcelDataUpload.findDetectorGround(i.project_num, i.point_num)
        have_ground_assess_type = have_ground.map(item => {
          return item = item.assess_type
        })

        if (have_ground_assess_type[0] == 3) {
          have_assess_type_3.push(i.point_num)
          delete i.project_num
          delete i.point_num
          delete i.assess_type
          let res = await ExcelDataUpload.updateReferenceTable(i)
          ctx.body = {
            msg: '更新' + res + '条数据成功,成功更新' + have_assess_type_3 + '的监测点位的修复标准表'
          }
        }
      }
    }else if (database_type == 7) {//更新水R2数据误差表
      let no_detector_project_num = []
      let no_lab_project_num = []
      let no_detector_num = 0
      let no_lab_num = 0
      let have_detector = []
      let have_lab = []
      let count

      for (let i of data) {
        delete i.id
        have_detector = await ExcelDataUpload.findDetectorWaterProject_num(i.project_num)
        have_lab = await ExcelDataUpload.findLabWaterProject_num(i.project_num)

        have_detector = have_detector.map(item => {
          return item = item.dataValues
        })//数据转换格式只取出有意义的数据

        have_lab = have_lab.map(item => {
          return item = item.dataValues
        })//数据转换格式只取出有意义的数据

        if (have_detector.length == 0) {
          no_detector_project_num.push(i.project_num)
          no_detector_num = no_detector_num + 1

        }//若数据库中水实时监测数据表中没有该地块信息则计数并将相应的地块信息存储起来

        if (have_lab.length == 0) {
          no_lab_project_num.push(i.project_num)
          no_lab_num = no_lab_num + 1
        }//若数据库中水实验室背景数据表中没有该地块信息则计数并将相应的地块信息存储起来


      }

      if (no_detector_num != 0 && no_lab_num != 0) {
        ctx.body = {
          msg: '水实时监测数据表中不含有' + no_detector_project_num + '地块信息，且水背景数据表中不含有' + no_lab_project_num + '地块信息，请先导入水实时监测数据表和水背景数据表。'
        }
      } else if (no_detector_num != 0 && no_lab_num == 0) {
        ctx.body = {
          msg: '水实时监测数据表中不含有' + no_detector_project_num + '地块信息，请先导入水实时监测数据表。'
        }
      } else if (no_detector_num == 0 && no_lab_num != 0) {
        ctx.body = {
          msg: '水背景数据表中不含有' + no_lab_project_num + '地块信息，请先导入水背景数据表。'
        }
      } else if (no_detector_num == 0 && no_lab_num == 0) {

        let updateRtable = await ExcelDataUpload.updateRwatertable(data)
        count = updateRtable
        ctx.body = {
          msg: '更新r2水相关数据表' + count + '条数据成功'
        }
      }
    }

  }
}

module.exports = excel_Controller